在前一篇文章中,我們專注於後端部分,展示了如何將多語言資料從本地 JSON 檔案轉為 API 形式管理,並將其部署到 Vercel。今天,我們將接著這個基礎,探討如何在前端整合這個 API,讓 React 應用能夠動態地從伺服器獲取翻譯資料,從而提升我們專案的 i18n 支援。
i18next-http-backend
是 i18next 的一個後端插件,允許你透過 HTTP 請求從伺服器端動態載入翻譯資料,而不是本地 JSON 檔案。這個插件非常適合當多語言資料隨著專案的規模變大,而需要集中管理並從伺服器動態獲取的場景。
具體來說,i18next-http-backend
提供了一個便捷的方式來讓你的前端應用透過 API 請求獲取翻譯資料,並且無需手動撰寫 HTTP 請求邏輯。它與 i18next 無縫整合,並自動處理翻譯資料的載入和語言變更。
接下來,我們來看如何使用 i18next-http-backend 來處理翻譯資料的動態載入。
i18next-http-backend
首先,你需要安裝以下的插件:
npm install i18next-http-backend dotenv-webpack
webpack.config.js
文件接下來,修改 webpack.config.js
使用 dotenv-webpack
來從 .env
文件中自動讀取變數並注入到 Webpack 中:
const Dotenv = require('dotenv-webpack');
module.exports = {
plugins: [
new HtmlWebpackPlugin({ template: './public/index.html' }),
new webpack.DefinePlugin({
'process.env.REACT_APP_VERSION': JSON.stringify(require("./package.json").version),
}),
new Dotenv(),
],
};
.env
文件在專案的根目錄中創建一個 .env
文件,並在其中定義 API 的 URL:
REACT_APP_I18N_API_URL=https://your-server-url/api/translations?lang=
i18next
並整合 i18next-http-backend
接下來,我們將設定 i18next
並使用 i18next-http-backend
來動態獲取翻譯資料。
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import HttpApi from 'i18next-http-backend';
import config from '@/utils/config';
import { log } from '@/utils/log';
i18n
.use(HttpApi) // 使用 i18next-http-backend
.use(initReactI18next)
.init({
lng: "en", // 預設語言
fallbackLng: "en", // 找不到語言時回退語言
debug: config.featureFlags.enableLogging && config.logLevel === logLevel.DEBUG, // 只有當 logLevel 設置為 DEBUG 時,啟用 debug 模式
interpolation: {
escapeValue: false, // React 已經防止了 XSS 攻擊
},
useSuspense: false,
backend: {
loadPath: (languages, namespaces) => {
const path = `${process.env.REACT_APP_I18N_API_URL}?lang=${languages[0]}`;
log(logLevel.DEBUG, `Dynamically generated loadPath: ${path}`); // 打印 loadPath
return path;
},
},
});
export default i18n;
說明:
backend.loadPath
:這是從後端伺服器獲取翻譯資料的 API URL。語言資料會根據當前選擇的語言動態加載。.env
文件中的 REACT_APP_I18N_API_URL
變數來設定 API 路徑。在設定好 i18next-http-backend
後,你可以在 React 應用中像之前一樣使用 t
函數來進行翻譯。
// src/pages/Portfolio/ProjectSection.jsx
import React, { useState } from 'react';
import * as styles from '@/pages/Portfolio/ProjectSection.module.scss';
import { Trans, useTranslation } from 'react-i18next';
import Swiper from '@/shared/Swiper/Swiper';
const ProjectSection = ({ id }) => {
const { t, i18n } = useTranslation();
const projectData = t('projectData', { returnObjects: true }); // 獲取服務數據
return (
<div id={id} className={`${styles.projectContainer} ${i18n.language}`}>
<div className={styles.titleSection}>
<h2 className={styles.title}>My Projects</h2>
<img src={require(`@/assets/icons/JS.png`)} />
</div>
<Swiper
items={projectData}
loop={false} // 支援無限循環
autoplay={false} // 自動播放
delay={4000} // 延遲 4 秒切換
direction="horizontal" // 水平滑動
onSlideChange={(currentIndex) => {
console.log(`Active slide is: ${currentIndex + 1}`);
}}
/>
</div>
);
};
export default ProjectSection;
這段代碼展示了如何在 React 中使用從 API 動態加載的翻譯資料來填充頁面內容。
使用 i18next-http-backend
,我們可以輕鬆地將翻譯資料從本地 JSON 檔案轉為 API 管理,讓我們的多語言支援更加靈活。透過這種動態加載的方式,前端應用不再依賴於本地翻譯檔案,可以即時從伺服器獲取最新的翻譯資料,提升應用的靈活性與可維護性。
✨ 流光館Luma<∕> ✨ 期待與你繼續探索更多技術知識!